/* 

给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？请你找出所有和为 0 且不重复的三元组。

注意：答案中不可以包含重复的三元组。

 

示例 1：

输入：nums = [-1,0,1,2,-1,-4]
输出：[[-1,-1,2],[-1,0,1]]
示例 2：

输入：nums = []
输出：[]
示例 3：

输入：nums = [0]
输出：[]
 

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

*/

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
// 三数之和解法
// 思想还是三数之和的思想
// 双指针基本跟while挂钩
var threeSumClosest = function (nums, target) {
    nums.sort((a, b) => a - b) // 排序
    let res = nums[0] + nums[1] + nums[2] // 三数之和 数组下标肯定>=2
    const len = nums.length;
    for (let i = 0; i < len - 2; i++) {
        // 双指针 写法还是三数之和的思想写法
        if (i === 0 || nums[i] !== nums[i - 1]) {
            let left = i + 1;
            let right = len - 1;
            while (left < right) {
                const tempNum = nums[i] + nums[left] + nums[right]
                // 判断条件
                if (Math.abs(target - tempNum) < Math.abs(target - res)) {
                    res = tempNum
                }
                if (tempNum > target) {
                    right--;
                    while (nums[right] === nums[right + 1]) right--;
                } else if (tempNum < target) {
                    left++
                    while (nums[left] === nums[left - 1]) left++;
                } else {
                    // 相等情况
                    return tempNum
                }
            }
        }

    }
    return res
};